package com.vito.oa.act.statistics;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

/**
 * 审批图标统计横坐标规则枚举
 * 
 * @author xuezhennan
 * 
 */
public enum AxisTypeEnum {
	/**
	 * 年，统计6年内数据
	 */
	YEAR("年", "yyyy", -5),
	/**
	 * 月，统计12月内数据
	 */
	MONTH("月", "yyyy MM", -11),
	/**
	 * 周，统计6周内数据
	 */
	WEEK("周", "yyyy ww", -5),
	/**
	 * 日，统计7天内数据
	 */
	DAY("日", "yyyy-MM dd", -6),
	/**
	 * 时，，统24小时内数据
	 */
	HOUR("时", "yyyy-MM-dd hh24", -23);
	/**
	 * 规则中文名
	 */
	private final String nameCN;
	/**
	 * 规则日期格式
	 */
	private final String typeFormat;
	/**
	 * 该规则下算取统计开始日期需要的间隔数
	 * 
	 * @see #getDateByDistance(Date, int)
	 */
	private final int startDistance;

	AxisTypeEnum(String nameCN, String typeFormat, int startDistance) {
		this.nameCN = nameCN;
		this.typeFormat = typeFormat;
		this.startDistance = startDistance;
	}

	public String getNameCN() {
		return nameCN;
	}

	public String getTypeFormat() {
		return typeFormat;
	}

	/**
	 * 根据xType获取默认的查询条件：开始时间
	 * 
	 * @return 时间字符串
	 */
	public String getStartTime() {
		Date date = new Date();
		date = getDateByDistance(date, this.startDistance);
		SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return f.format(date);
	}

	/**
	 * 根据xType获取默认的x轴所有坐标
	 * 
	 * @return
	 */
	public List<String> getxData() {
		Date endTime = new Date();
		List<String> xData = new LinkedList<String>();
		SimpleDateFormat f = new SimpleDateFormat(this.typeFormat);
		xData.add(f.format(endTime));
		int distance = this.startDistance;
		for (int i = 0; distance + i < 0; i++) {
			endTime = getDateByDistance(endTime, -1);
			xData.add(f.format(endTime));
		}
		Collections.reverse(xData);
		return xData;
	}

	/**
	 * 根据当前枚举的日期规则，获取{@code date}相距{@code distance}的日期
	 * 
	 * @param date
	 *            给定的日期
	 * @param distance
	 *            间隔数
	 * @return {@code date+distance}
	 */
	private Date getDateByDistance(Date date, int distance) {
		if (date == null) {
			date = new Date();
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		switch (this) {
		case YEAR:
			calendar.add(Calendar.YEAR, distance);
			break;
		case MONTH:
			calendar.add(Calendar.MONTH, distance);
			break;
		case WEEK:
			calendar.add(Calendar.WEEK_OF_YEAR, distance);
			break;
		case DAY:
			calendar.add(Calendar.DAY_OF_YEAR, distance);
			break;
		case HOUR:
			calendar.add(Calendar.HOUR, distance);
			break;
		default:
			calendar.add(Calendar.DAY_OF_YEAR, distance);
			break;
		}
		return calendar.getTime();
	}

	/**
	 * 判断是否存在该枚举类型，存在就返回。
	 * 
	 * @param typeStr
	 * @return 符合参数的枚举对象
	 */
	public static AxisTypeEnum typeOf(String typeStr) {
		for (AxisTypeEnum item : AxisTypeEnum.values()) {
			if (item.name().equals(typeStr.toUpperCase())) {
				return item;
			}
		}
		return null;
	}

}
